perm filename KWIC.PRG[T,LSP]2 blob
sn#627075 filedate 1981-12-01 generic text, type C, neo UTF8
COMMENT ⊗ VALID 00002 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00002 00002
C00023 ENDMK
C⊗;
KWIC: PROCEDURE OPTIONS (MAIN); KWI00010
/*A PROGRAM TO FORMAT A KWIC INDEX*/ KWI00020
KWI00030
DECLARE KWI00040
DIR(10) FIXED (3,0),/*DIRECTORY ARRAY*/ KWI00050
I FIXED (2,0),/*COUNTER*/ KWI00060
BIB CHAR (134) VARYING,/*BIBLIOGRAPHICAL MATERIAL*/ KWI00070
TRUE BIT (1),/*SWITCH TRANSLATION*/ KWI00080
FALSE BIT (1),/*SWITCH TRANSLATION*/ KWI00090
OKOK BIT (1),/*END FLAG*/ KWI00100
KEYWORDS(500,2) CHAR(50) VARYING,/*KWIC ELEMENTS*/ KWI00110
FILL FIXED (3,0),/*COUNTER FOR ARRAY*/ KWI00120
STOPWORDS(7) VARYING CHAR(10) INIT ('A','AN','AND','FOR', KWI00130
'OF','THE','TO'),/*NON INDEXED TERMS*/ KWI00140
STOPWORDLENGTH FIXED BIN(15);/*SIZE OF STOPWD ARRAY*/ KWI00150
KWI00160
/*INITIALIZE VARIABLES*/ KWI00170
KWI00180
I = 0; KWI00190
DIR = 0; KWI00200
OKOK = '1'B; KWI00210
TRUE = '1'B; KWI00220
FALSE = '0'B; KWI00230
DIR(10) = 0; KWI00240
FILL = 1; KWI00250
STOPWORDLENGTH = 7; KWI00260
KWI00270
ON ENDFILE (SYSIN) OKOK = FALSE; KWI00280
KWI00290
KWI00300
GET EDIT ((DIR (I) DO I = 1 TO 9),BIB) KWI00310
(9 F(3,0),A(133)); KWI00320
KWI00330
MRCTIME:/*GRAB TITLE & LCCN OUT OF BIB MATERIAL*/ KWI00340
DO WHILE (OKOK); KWI00350
KWI00360
CALL SEPARATE (SUBSTR(BIB,DIR(3),DIR(4)-DIR(3)), KWI00370
SUBSTR(BIB,DIR(7),DIR(8)-DIR(7))); KWI00380
GET EDIT ((DIR (I) DO I = 1 TO 9),BIB) KWI00390
(9 F(3,0),A(133)); KWI00400
END MRCTIME; KWI00410
KWI00420
CALL SORT(KEYWORDS,FILL-1); KWI00430
KWI00440
CALL PRINT←IT(KEYWORDS,FILL-1); KWI00450
KWI00460
KWI00470
/*DIVIDE TITLES INTO KEYWORDS & STICK IN AN ARRAY WITH LCCN*/ KWI00480
SEPARATE: PROCEDURE (TITLE,LCCN); KWI00490
KWI00500
DECLARE KWI00510
TITLE CHAR(50) VARYING, KWI00520
LCCN CHAR(12) VARYING, KWI00530
POSITION FIXED (3,0), KWI00540
RESULT BIT (1), KWI00550
MORE BIT (1),
WORD CHAR(50) VARYING; KWI00560
KWI00570
PUT DATA (TITLE); KWI00580
KWI00590
POSITION = INDEX(TITLE,' '); KWI00600
MORE = TRUE;
KWI00610
SAMURAI: DO WHILE (MORE);
IF POSITION ↑= 0 THEN/*CHOP UP TITLE*/
WORD = SUBSTR(TITLE,1,POSITION - 1);
ELSE
DO;
MORE = FALSE;
WORD = TITLE;
END;
/*SCAN FOR STOPWORDS*/ KWI00650
CALL MEMBER (WORD,STOPWORDS,STOPWORDLENGTH,RESULT); KWI00660
KWI00670
IF (RESULT = FALSE) THEN /*FILL ARRAY ACCEPTABLE WDS*/ KWI00680
DO; KWI00690
KEYWORDS(FILL,1) = WORD; KWI00700
KEYWORDS(FILL,2) = LCCN; KWI00710
FILL = FILL + 1; KWI00720
END; KWI00730
PUT DATA (KEYWORDS(FILL,1)); KWI00740
TITLE = SUBSTR(TITLE,POSITION + 1); KWI00750
POSITION = INDEX(TITLE,' '); KWI00760
END SAMURAI; KWI00770
END SEPARATE; KWI00780
KWI00790
MEMBER: PROCEDURE (ITEM,SET,N,RESULT); KWI00800
DECLARE KWI00810
SET(*) CHAR (10) VARYING, KWI00820
N FIXED BINARY (15), /*NO. OF STOPWORDS IN ARRAY*/ KWI00830
I FIXED BINARY (15),/*ARRAY COUNTER*/ KWI00840
GOGOGO BIT (1),/*SWITCH*/ KWI00850
RESULT BIT (1), KWI00860
ITEM CHAR (50) VARYING; KWI00870
KWI00880
/*INITIALIZE VARIABLES*/ KWI00890
RESULT = FALSE; KWI00900
GOGOGO = TRUE; KWI00910
I = 1; KWI00920
PUT DATA (ITEM); KWI00930
KWI00940
TEST: DO WHILE ((I <= N) & GOGOGO); KWI00950
IF (ITEM = SET(I)) THEN DO; GOGOGO = FALSE; KWI00960
RESULT = TRUE; KWI00970
END; KWI00980
I = I + 1; KWI00990
END TEST; KWI01000
END MEMBER; KWI01010
KWI01020
SORT: PROCEDURE (ARRAY,LOC); KWI01030
DECLARE KWI01040
ARRAY(*,*) CHAR(50) VARYING,/*KEYWDS & LCCNS*/ KWI01050
TEMP CHAR(50) VARYING,/*FOR SHUFFLING AROUND ARRAY ITEMS*/ KWI01060
LOC FIXED BIN(15),/*POINTER TO ARRAY* KWI01070
PASS FIXED BIN(15),/*LOOKING OVER ARRAY*/ KWI01080
J FIXED BIN(15),/*COUNTER*/ KWI01090
GO BIT(1);/*SWITCH*/ KWI01100
KWI01110
GO = TRUE; KWI01120
KWI01130
OUT←OF←SORTS: DO PASS = 1 TO LOC - 1 KWI01140
WHILE (GO); KWI01150
KWI01160
GO = FALSE; KWI01170
KWI01180
KWI01190
EACH←PASS: DO J = 1 TO LOC - PASS; KWI01200
IF ARRAY(J,1) > ARRAY(J + 1,1) THEN KWI01210
DO; KWI01220
GO = TRUE; KWI01230
TEMP = ARRAY(J,1); KWI01240
ARRAY(J,1) = ARRAY(J + 1,1); KWI01250
ARRAY(J + 1,1) = TEMP; KWI01260
TEMP = ARRAY(J,2); KWI01270
ARRAY(J,2) = ARRAY(J + 1,2); KWI01280
ARRAY(J + 1,2) = TEMP; KWI01290
END; KWI01300
END EACH←PASS; KWI01310
END OUT←OF←SORTS; KWI01320
END SORT; KWI01330
KWI01340
PRINT←IT: PROCEDURE(WORDS,FINDEM); KWI01350
KWI01360
DECLARE KWI01370
WORDS(*,*) CHAR(50) VARYING, KWI01380
FINDEM FIXED BIN(15); KWI01390
KWI01400
FINDEM = 1; KWI01410
KWI01420
PUT SKIP LIST KWI01430
(WORDS(FINDEM,1)); KWI01440
PUT SKIP LIST KWI01450
(' '||WORDS(FINDEM,2)); KWI01460
KWI01470
LIST: DO I = 1 TO FINDEM; KWI01480
IF WORDS(FINDEM,1) ↑= WORDS((FINDEM + 1),1) THEN KWI01490
DO; KWI01500
PUT SKIP(2) LIST (WORDS(FINDEM,1)); KWI01510
PUT SKIP LIST (' '||WORDS(FINDEM,2)); KWI01520
END; KWI01530
ELSE PUT SKIP LIST (' '||WORDS(FINDEM,2)); KWI01540
FINDEM = FINDEM + 1; KWI01550
END LIST; KWI01560
END PRINT←IT; KWI01570
END KWIC; KWI01580
R; T=0.13/0.72 01:08:13
.λ